package to_op

import (
	"context"
	"fmt"
	"time"
)

// CtxTimeOutSingle  单个任务超时
func CtxTimeOutSingle() {
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // 告诉子协程超时时间
	defer cancel()

	//cancel()
	//time.Sleep(5 * time.Second)

	go func(ctx context.Context) {
		select { //
		case <-ctx.Done(): // 这里只是判断启动协程时候有没有被超时取消
			deadline, ok := ctx.Deadline()
			fmt.Println("-------------------", deadline, ok)
			// 判断取消原因
			switch ctx.Err() {
			case context.Canceled:
				fmt.Println("上下文调cancel()主动取消")
			case context.DeadlineExceeded:
				fmt.Println("上下文超时取消")
			default:
				fmt.Println("其他原因")
			}

		default:
			// 执行任务逻辑
			fmt.Println("执行任务逻辑开始")
			time.Sleep(3 * time.Second)
			fmt.Println("执行任务逻辑结束")
			return
		}

	}(ctx)

	time.Sleep(7 * time.Second)
	// 这里会超时执行defer取消
}

func CtxCancel() {

	ctx, cancel := context.WithCancel(context.Background())

	// 启动任务处理
	go func(ctx context.Context) {
		time.Sleep(5 * time.Second)

		select { //
		case <-ctx.Done(): // 这里只是判断启动协程时候有没有被取消
			deadline, ok := ctx.Deadline()
			fmt.Println("-------------------", deadline, ok)
			// 判断取消原因
			switch ctx.Err() {
			case context.Canceled:
				fmt.Println("上下文调cancel()主动取消")
			case context.DeadlineExceeded:
				fmt.Println("上下文超时取消")
			default:
				fmt.Println("其他原因")
			}

		default:
			// 执行任务逻辑
			fmt.Println("执行任务逻辑开始")
			time.Sleep(3 * time.Second)
			fmt.Println("执行任务逻辑结束")
			return
		}
	}(ctx)

	// 2秒后取消任务
	time.Sleep(2 * time.Second)
	fmt.Println("取消任务...")
	cancel()

	time.Sleep(20 * time.Second)

}
